import ast
import logging
from 程序核心代码.mvvm重构.基础定义.基础图形项.节点图形项.带组件带布局的节点图形项 import 带组件带布局的节点图形项
from 程序核心代码.mvvm重构.基础定义.基础模型.ast节点模型基类 import ast节点基础模型
from 程序核心代码.mvvm重构.基础定义.节点管理器.自动节点注册表 import 注册节点模型, 节点模型匹配器, 注册节点图形项

logging.basicConfig(level=logging.WARNING, format='%(asctime)s - %(levelname)s - %(message)s')
日志记录器 = logging.getLogger(__name__)

@注册节点模型(ast.Assign)
class 赋值节点模型(ast节点基础模型):
    """
    赋值节点模型，用于表示Python中的赋值操作
    例如：x = 1, y = z = 2 等
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        # 获取赋值目标的名称列表
        目标名称列表 = []
        for 目标 in ast节点.targets:
            if isinstance(目标, ast.Name):
                目标名称列表.append(目标.id)
            elif hasattr(目标, 'attr'):  # 处理属性访问，如 obj.attr = value
                目标名称列表.append(f"{目标.value.id if hasattr(目标.value, 'id') else '...'}.{目标.attr}")
            else:
                目标名称列表.append("...")

        目标名称 = ", ".join(目标名称列表)
        super().__init__(ast节点, 所属节点模型管理器, f"赋值: {目标名称}", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 创建执行流接口
        self.添加接口到节点("执行流", "输入", 接口名称="执行入口")
        self.添加接口到节点("执行流", "输出", 接口名称="执行完成")

        # 处理赋值的值
        值节点 = 节点模型匹配器(self._ast节点.value, self.所属节点模型管理器)
        if 值节点:
            起始接口 = 值节点.添加接口到节点("数据流", "输出", 接口名称="值", 必须连接=True)
            结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="值", 必须连接=True)
            起始接口.接口创建连接线模型(结束接口, self)

        # 处理赋值的目标
        for 索引, 目标 in enumerate(self._ast节点.targets):
            目标节点 = 节点模型匹配器(目标, self.所属节点模型管理器)
            if 目标节点:
                起始接口 = self.添加接口到节点("数据流", "输出", 接口名称=f"目标_{索引}", 必须连接=True)
                结束接口 = 目标节点.添加接口到节点("数据流", "输入", 接口名称="赋值", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

@注册节点模型(ast.AnnAssign)
class 带注解赋值节点模型(ast节点基础模型):
    """
    带注解赋值节点模型，用于表示Python中带类型注解的赋值操作
    例如：x: int = 1
    """
    def __init__(self, ast节点, 所属节点模型管理器, 上级节点=None, 节点位置=None):
        目标名称 = ast节点.target.id if hasattr(ast节点.target, 'id') else "..."
        super().__init__(ast节点, 所属节点模型管理器, f"带注解赋值: {目标名称}", 节点位置=节点位置, 上级节点=上级节点)

        # 设置日志级别
        if self.调试模式:
            日志记录器.setLevel(logging.DEBUG)
            日志记录器.debug(f"{self.__class__.__name__}调试模式已开启")
        else:
            日志记录器.setLevel(logging.ERROR)

        # 创建执行流接口
        self.添加接口到节点("执行流", "输入", 接口名称="执行入口")
        self.添加接口到节点("执行流", "输出", 接口名称="执行完成")

        # 处理类型注解
        注解节点 = 节点模型匹配器(self._ast节点.annotation, self.所属节点模型管理器)
        if 注解节点:
            起始接口 = 注解节点.添加接口到节点("数据流", "输出", 接口名称="类型", 必须连接=True)
            结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="类型注解", 必须连接=True)
            起始接口.接口创建连接线模型(结束接口, self)

        # 处理赋值的值（如果有）
        if self._ast节点.value:
            值节点 = 节点模型匹配器(self._ast节点.value, self.所属节点模型管理器)
            if 值节点:
                起始接口 = 值节点.添加接口到节点("数据流", "输出", 接口名称="值", 必须连接=True)
                结束接口 = self.添加接口到节点("数据流", "输入", 接口名称="值", 必须连接=True)
                起始接口.接口创建连接线模型(结束接口, self)

        # 处理赋值的目标
        目标节点 = 节点模型匹配器(self._ast节点.target, self.所属节点模型管理器)
        if 目标节点:
            起始接口 = self.添加接口到节点("数据流", "输出", 接口名称="目标", 必须连接=True)
            结束接口 = 目标节点.添加接口到节点("数据流", "输入", 接口名称="赋值", 必须连接=True)
            起始接口.接口创建连接线模型(结束接口, self)

